home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / oscan_60.arc / OSCAN_60.S < prev   
Text File  |  1990-04-16  |  81KB  |  1,914 lines

  1. ;----------------------------------------------------;
  2. ;                                                    ;
  3. ;      OSCAN_60.S       Version 1.6b                 ;
  4. ;      Bernd Gebauer   ,Berlin 31.05.89              ;
  5. ;      Karsten Isakovic,Berlin 07.07.89              ;
  6. ;                                                    ;
  7. ;      Edited: On 11/07/1989  for  60 Herz. Monitor  ;
  8. ;              On 04/16/1990  for  release           ;
  9. ;              By: Bradford W. Mott                  ;
  10. ;                                                    ;
  11. ;  RAMTOS 1.4 / BETATOS / ROMTOS 1.4 / BLITTER TOS   ;
  12. ; -------------------------------------------------  ;
  13.  
  14.  
  15.  
  16. ; ------------ NEGATIVE LINE-A VARIABLEN -------------
  17.  
  18. M_POS_HX       = -$358
  19. WKXRez         = -$2b4
  20. WKYRez         = -$2b2
  21. CUR_X          = -$158
  22. CUR_Y          = -$156
  23. CUR_FLAG       = -$154
  24. MOUSE_FLAG     = -$153
  25. SAVE_LEN       = -$14a
  26. v_cel_ht       = -$2e
  27. v_cel_mx       = -$2c
  28. v_cel_my       = -$2a
  29. v_cel_wr       = -$28
  30. v_cur_add      = -$22
  31. v_cur_of       = -$1e
  32. v_cur_x        = -$1c
  33. v_cur_y        = -$1a
  34. v_rez_hz       = -$c
  35. v_rez_vt       = -4
  36. bytes_lin      = -2
  37. ; ---------- LINE-A VARIABLEN ------------------------
  38.  
  39. v_planes       = 0
  40. width          = 2
  41. col_bit0       = $18
  42. col_bit1       = $1a
  43. col_bit2       = $1c
  44. col_bit3       = $1e
  45. lstlin         = $20
  46. lnmask         = $22
  47. wmode          = $24
  48. x1             = $26
  49. y1             = $28
  50. x2             = $2a
  51. y2             = $2c
  52. patptr         = $2e
  53. patmsk         = $32
  54. mfill          = $34
  55. clip           = $36
  56.  
  57. ; ----------------- HARDWARE + TOS -------------------
  58.  
  59. gemdos         = 1
  60. bios           = 13
  61. xbios          = 14
  62. Pterm0         = 0       ; Gemdos
  63. Cconin         = 1       ; Gemdos
  64. Cnecin         = 8       ; Gemdos
  65. Cconws         = 9       ; Gemdos
  66. Dgetdrv        = 25      ; Gemdos
  67. Ptermres       = 49      ; Gemdos
  68. Fopen          = 61      ; Gemdos
  69. Fclose         = 62      ; Gemdos
  70. Fwrite         = 64      ; Gemdos
  71. Fseek          = 66      ; Gemdos
  72. Pterm          = 76      ; Gemdos
  73. Kbshift        = 11      ; bios
  74. Physbase       = 2       ; xbios
  75. Setscreen      = 5       ; xbios
  76. Supexec        = 38      ; xbios
  77. Dosound        = 32      ; xbios
  78. dostrap        = $84
  79. gemtrap        = $88
  80. xbiostrap      = $b8
  81. memtop         = $436
  82. defshiftmd     = $44b
  83. sshiftmd       = $44c
  84. v_bas_add      = $44e
  85. _nvbls         = $454
  86. _vblqueue      = $456
  87. dumpflag       = $4ee
  88. sysbase        = $4f2
  89. hardcopy       = $502
  90. vid_bashigh    = $ff8201
  91. vid_basmid     = $ff8203
  92. vid_ismid      = $ff8207
  93. vid_pal3       = $ff8246
  94. vid_palF       = $ff825e
  95. add_len        = $9000
  96.  
  97.                TEXT 
  98. main:          bra.s     Start_of_Code       ; Zum Anfang springen
  99.  
  100. ;#############################################################
  101. ;#
  102. ;# Die Tabelle der BildschirmWerte
  103. ;#
  104. ;#############################################################
  105.  
  106. ScreenTab:     DC.w 352,704,672             ;   X-Auflösung Low,Mid,High
  107.                DC.w 224,224,480             ;   Y-Auflösung
  108.                DC.w 234,234,100             ;   Bytes pro Zeile
  109.                DC.l -$1600,-$1600,$2000     ;   VideoAdd  <> Memtop Offset
  110.                DC.l $D2,$D2,9800            ;   v_bas_add <> Memtop Offset
  111.                DC.w 320,640,640             ;   Alte X-Auflösung
  112.                DC.w 200,200,400             ;   Alte Y-Auflösung
  113. TruePhys:      DC.w 0   ;                       Physbase Emulation aus
  114. ActivateKey:   DC.b 9,0 ;                       Hardcopy Taste
  115. ;#############################################################
  116. ;#
  117. ;# Das Hauptprogramm
  118. ;#
  119. ;#############################################################
  120.  
  121. Start_of_Code: movea.l   4(sp),a5            ; Basepointer einrichten
  122.                lea     $100(a5),sp           ; Stack einrichten
  123.  
  124.                pea       do_setup(pc)        ; Test und Installation im
  125.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  126.                trap      #xbios              ; Ergebnis in inst_ok
  127.                addq.l    #6,sp
  128.  
  129.                move.w    inst_ok,d0
  130.                tst.w     d0                  ; war Installation erfolgreich ?
  131.                bne       not_ok              ; leider nein, raus
  132.  
  133.                move.w    #Dgetdrv,-(sp)      ; Bootlaufwerk holen
  134.                trap      #gemdos             ;
  135.                addq.l    #2,sp               ;
  136.                lea     save_name(pc),a0      ;
  137.                add.b     d0,(a0)             ; und einstellen
  138.  
  139.                move.w    #-1,-(sp)           ;   Irgendeine Sondertaste gedrückt
  140.                move.w    #Kbshift,-(sp)      ;
  141.                trap      #bios               ;
  142.                addq.l    #4,sp               ;
  143.                tst.w     d0
  144.                beq       DoIntro
  145.                bsr       UserInstall
  146.                bra       DoTitle
  147. DoIntro:       bsr       Intro               ; GrowBox und Sound ausgeben
  148. DoTitle:       pea       msg_title(pc)       ; Titelzeile ausgeben
  149.                move.w    #Cconws,-(sp)
  150.                trap      #gemdos
  151.                addq.l    #6,sp
  152.                pea       msg_installed(pc)   ; 'Installiert' Meldung ausgeben
  153.                move.w    #Cconws,-(sp)
  154.                trap      #gemdos
  155.                addq.l    #6,sp
  156.  
  157.                clr.w     -(sp)               ; Resident beenden
  158.                lea     _ende(pc),a0        ;   Programmende
  159.                suba.l    a5,a0               ; - Programmanfang
  160.                move.l    a0,-(sp)            ; = Programmlaenge
  161.                move.w    #Ptermres,-(sp)
  162.                trap      #gemdos
  163. ;-----------------------------------------------------
  164. not_ok:        pea       msg_title(pc)       ; Titelzeile ausgeben
  165.                move.w    #Cconws,-(sp)
  166.                trap      #gemdos
  167.                addq.l    #6,sp
  168.                move.w    inst_ok,d0
  169.                cmpi.w    #1,d0               ; war's das falsche TOS ?
  170.                bne       main_2              ; nein -> Kein Overscan-Modus
  171.  
  172.                pea       msg_notactive(pc)   ; 'Nicht aktiviert' Meldung ausgeben
  173.                move.w    #Cconws,-(sp)
  174.                trap      #gemdos
  175.                addq.l    #6,sp
  176.                bra       Goodbye             ; einfach beenden
  177. ;-----------------------------
  178. main_2:        cmpi.w    #2,d0
  179.                bne       main_3
  180.                pea       msg_noTos(pc)       ; 'Falsches TOS' Meldung ausgeben
  181.                move.w    #Cconws,-(sp)
  182.                trap      #gemdos
  183.                addq.l    #6,sp
  184.                bra       wait_key            ; einfach beenden
  185. ;-----------------------------
  186. main_3:        pea       msg_already(pc)     ; 'Schon installiert' Meldung
  187.                move.w    #Cconws,-(sp)       ; ausgeben
  188.                trap      #gemdos
  189.                addq.l    #6,sp               ;  und
  190. ;-----------------------------
  191. wait_key:      move.w    #Cnecin,-(sp)       ; Auf Tastendruck warten
  192.                trap      #gemdos
  193.                addq.l    #2,sp
  194. ;-----------------------------
  195. Goodbye:       clr.w     -(sp)               ; Programm beenden (Returncode 0)
  196.                trap      #gemdos
  197.  
  198. ;############################################################
  199. ;#
  200. ;# Die Installations-Routine
  201. ;#
  202. ;#############################################################
  203.  
  204. do_setup:      movem.l   d0-d7/a0-a6,-(sp)
  205.                move.w    #3,inst_ok          ; Status : schon installiert
  206.  
  207.                movea.l   dostrap,a0          ; GemDos-Trap nach OVERSCAN absuchen
  208.  
  209. tstXBRA:       cmpi.l    #'XBRA',-12(a0)     ; XBRA ?
  210.                bne       noXBRA              ; nein -> Ende der Vektorkette
  211.                cmpi.l    #'OVER',-8(a0)      ; OVER ?
  212.                beq       EndSetup            ; ja   -> Schon Installiert !
  213.                movea.l   -4(a0),a0           ;
  214.                bra       tstXBRA             ; weiter suchen
  215.  
  216. noXBRA:        move.w    #2,inst_ok          ; Status : falsches TOS
  217. ;----------------------------  auf richtige TOS-Version testen
  218.  
  219.                sf        BadTos              ; TOS als ok annehmen
  220.  
  221. testBETATOS:   movea.l   #$170ee,a0          ;-------- Ist es BETA-RAMTOS ?
  222.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  223.                beq       isBETA              ; ja
  224.                cmpi.l    #$e848cec0,(a0)     ;     LSR #4,D0 / MULU D0,D7 ?
  225.                bne       testRAMTOS1_4       ; nein -> RAMTOS1.4
  226.                move.l    #$cec0e84f,$170ee   ;     MULU D0,D7 / LSR #4,D7
  227. isBETA:        movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  228.                bra       TOSok               ;
  229.  
  230. testRAMTOS1_4: movea.l   #$17192,a0          ;-------- Ist es RAMTOS 1.4 ?
  231.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  232.                beq       isRAMTOS1_4
  233.                cmpi.l    #$e848cec0,(a0)     ;
  234.                bne       testROMTOS1_4       ; nein -> ROMTOS1.4
  235.                move.l    #$cec0e84f,$17192   ;     1. mal Scrollfehler
  236. isRAMTOS1_4:   move.l    #$cec0e84f,$171d6   ;     2. mal Scrollfehler beheben
  237.                movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  238.                bra       TOSok               ;
  239.  
  240. testROMTOS1_4: movea.l   sysbase,a1          ;-------- Ist es ROMTOS 1.4 ?
  241.                cmpi.w    #$0104,2(a1)        ;     os_version testen
  242.                bne       testTOS1_2          ; nein -> TOS 1.2 (BlitterTOS)
  243.                movea.l   $532c,a0            ;     A0 = Zeiger auf MemAllocList
  244.                bra       TOSok               ;
  245.  
  246. testTOS1_2:    cmpi.w    #$0102,2(a1)        ;-------- Ist es TOS 1.2 ?
  247.                bne       EndSetup            ; nein -> falsches TOS -> ENDE
  248.                st        BadTos              ;     BlitterTOS -> Flag setzen
  249.                movea.l   $7e92,a0            ;     A0 = Zeiger auf MemAllocList
  250.  
  251. TOSok:         move.w    #1,inst_ok          ; Status : Nicht im OVERSCAN-Modus
  252. ;---------------------------------------------
  253. ; Ist der Schalter umgelegt (OVERSCAN aktiv) ?
  254. ; Es wird gewartet, bis der Videoadresszähler bis zum Ende
  255. ; der normalen Bildschirmseite hochgezählt hat.
  256. ; Dann wird getestet, ob er auf den Anfang zurückspringt.
  257. ; Tut er das nicht, ist OVERSCAN aktiv.
  258.                clr.w     d0
  259.                move.b    vid_basmid,d0       ;
  260.                move.w    d0,d1               ;
  261.                addi.w    #$7d,d1             ;
  262. Wait1:         cmp.b     vid_ismid,d1        ;
  263.                bne       Wait1               ;
  264. Wait2:         cmp.b     vid_ismid,d1        ;
  265.                beq       Wait2               ;
  266.                cmp.b     vid_ismid,d0        ;
  267.                beq       EndSetup            ; Nicht aktiv -> Beenden
  268.  
  269.                clr.w     inst_ok             ; Status : OVERSCAN aktiv
  270.  
  271.                move.l    v_bas_add,StartBasAdd    ; Startaddr des Bildschirms
  272.  
  273.                move.l    memtop,d0           ;     Letzte beschreibbare Addresse
  274.                addi.l    #$8000,d0           ;     bestimmen und merken
  275.                move.l    d0,MemEnd           ;
  276.  
  277.                subi.l    #add_len,8(a0)      ;     Belegten Speicherblock
  278.                subi.l    #add_len,memtop     ;     ... verkürzen
  279.  
  280.                tst.b     BadTos              ; BlitterTOS ?
  281.                beq       no_extra_buff       ; nein, weiter
  282.                subi.l    #32768,8(a0)        ;     32K Sicherheitpuffer ...
  283.                subi.l    #32768,memtop       ;     ... vor Bildspeicher anlegen
  284. no_extra_buff: 
  285.                clr.w     d0
  286.                move.b    sshiftmd,d0
  287.                move.w    d0,Reso             ;     Auflösung merken
  288.                DC.w $a000                   ; LineA init
  289.                move.l    d0,LineA            ;     Zeiger auf LineA Variablen
  290.                move.l    memtop,MyMemtop     ;     AltenWert sichern
  291.                bsr       SetOverscan         ;     Overscan Werte einstellen
  292. ;
  293. ; Diese einmalige Initialisieren der Werte reicht nicht aus,
  294. ; da sie beim Starten vom AES wieder zurückgesetzt werden.
  295. ; Wir müssen also die Werte kurz nach v_opnwk nochmal setzen
  296. ;
  297. ;----------------------> ALSO  GEM-Routine (AES/VDI) umleiten
  298.                lea     OldVec(pc),a0       ; Alten GemTrapVektor retten
  299.                move.l    gemtrap,(a0)        ;
  300.                lea     MyGem(pc),a0        ;
  301.                move.l    a0,gemtrap          ; und neuen Vektor eintragen
  302.                tst.b     BadTos              ; BlitterTOS ?
  303.                beq       NoSlot              ; nein -> Nicht in VBL einhängen
  304.  
  305.                move.w    _nvbls,d0           ; Anzahl Routinen in _vblqueue
  306.                lsl.w     #2,d0               ; mal sizeof(long)
  307.                movea.l   _vblqueue,a0        ; Zeiger auf _vblqueue
  308.                moveq.l   #4,d1               ; ersten Slot auslassen
  309. TestSlot:      tst.l     0(a0,d1.w)          ; ist Eintrag frei ?
  310.                beq.s     SlotFound           ; ja, gefunden
  311.                addq.w    #4,d1               ; offset für nächsten Slot
  312.                cmp.w     d0,d1               ; Ende der Liste ?
  313.                bne.s     TestSlot            ; nein, nächsten Slot testen
  314.                bra       NoSlot              ; keinen freien Slot gefunden, raus
  315. SlotFound:     
  316.                lea     MyVB(pc),a1         ; eigene VBL-Routine ...
  317.                move.l    a1,0(a0,d1.w)       ; ... in Slot eintragen
  318. NoSlot:        
  319. ;---------------------------- Gemdos umleiten
  320.                lea     OldDos(pc),a0       ;     Alten GemdosVektor retten
  321.                move.l    dostrap,(a0)        ;
  322.                lea     MyDos(pc),a0        ;
  323.                move.l    a0,dostrap          ;     und neuen Vektor eintragen
  324. ;---------------------------- Xbios umleiten
  325.                lea     OldXbios(pc),a0     ;     Alten XbiosVektor retten
  326.                move.l    xbiostrap,(a0)      ;
  327.                lea     MyXbios(pc),a0      ;
  328.                move.l    a0,xbiostrap        ;     und neune Vektor eintragen
  329. ;---------------------------- Hardcopy-Routine umleiten
  330.                lea     OldHard(pc),a0      ;     Alten HardcopyVektor retten
  331.                move.l    hardcopy,(a0)       ;
  332.                lea     MyHard(pc),a0       ;
  333.                move.l    a0,hardcopy         ;     und neuen Vektor eintragen
  334.  
  335.                sf        GemStarted
  336. EndSetup:      movem.l   (sp)+,d0-d7/a0-a6
  337.                rts       
  338.  
  339. ;#############################################################
  340. ;#
  341. ;# Die umgebogenen Traps und Vektoren
  342. ;# ----------------------------------
  343. ;#        MyGem      AES/VDI Trap
  344. ;#        MyDos      GEMDOS  Trap
  345. ;#        MyXbios    XBIOS   TRAP
  346. ;#        MyHard     Hardcopy-Vektor
  347. ;#        MyVB       VerticalBlank-Vektor (nur bei BlitterTOS )
  348. ;#        MyMouse    Mouse-Vektor         (nur bei BlitterTOS)
  349. ;#
  350. ;################################################ GEM- TRAP
  351.  
  352. ; XBRA-Protokoll
  353.                DC.b "XBRAOVER"              ; !! Ja, das ist alles !!
  354. OldVec:        DC.l 0
  355. MyGem:         cmpi.w    #$73,d0             ; Ist es ein VDI-Aufruf ?
  356.                bne       NotMyGem            ;   nein -> weiter
  357.                movea.l   d1,a0               ; Addresse der VDI-Parameterfelder
  358.                move.l    12(a0),WorkOut      ; WorkOut-Zeiger speichern
  359.                movea.l   (a0),a0             ; VDI-Control[0] = VDI-Befehlscode
  360.                cmpi.w    #1,(a0)             ; ist es Open-WorkStation ?
  361.                bne       NotMyGem            ;    nein-> weiter
  362.                movea.l   d1,a0
  363.                movea.l   4(a0),a0            ; WorkIn-Zeiger
  364.                cmpi.w    #5,(a0)             ;    WorkIn[0] gleich Screen ?
  365.                bge       NotMyGem            ;    nein -> weiter
  366. ;-------------> NACH !!! 'v_opnwk()' in Patchroutine springen
  367.                move.l    2(sp),Back          ; Orginal Rücksprungadresse merken
  368.                lea     PatchIt(pc),a0      ; Rücksprung auf 'PatchIt' ...
  369.                move.l    a0,2(sp)            ; ... umleiten
  370. NotMyGem:      movea.l   OldVec(pc),a0       ; Orginal GEM-Routine ...
  371.                jmp       (a0)                ; ... ausführen
  372. ;----------------------------------------------------------
  373. PatchIt:       bsr       SetOverscan         ; LineA Werte nochmal eintragen
  374.  
  375.                move.w    #-1,-(sp)           ;   Auf rechte Schifttaste testen
  376.                move.w    #Kbshift,-(sp)      ;
  377.                trap      #bios               ;
  378.                addq.l    #4,sp               ;
  379.                tst.w     d0
  380.                beq       PatchCont
  381.  
  382.                bsr       UserInstall
  383.  
  384. PatchCont:     bsr       ClearScreen         ; Rand löschen
  385.                pea       msg_erase(pc)       ; und Mitte auf Weiss
  386.                move.w    #Cconws,-(sp)       ;
  387.                trap      #gemdos             ;
  388.                addq.l    #6,sp               ;
  389.                st        GemStarted          ; Okay GEM läuft
  390.                movea.l   WorkOut,a0          ; Adresse des Workout-Feldes
  391.                move.w    RezX,0(a0)          ; Work_out[0] = Breite
  392.                move.w    RezY,2(a0)          ; Work_out[1] = Höhe
  393.  
  394.                move.w    VPlanes,d0          ; Farben Vorgeben
  395.                cmpi.w    #4,d0
  396.                bne       PatchMid
  397.                move.w    #200,78(a0)
  398.                move.w    #16,26(a0)
  399.                bra       PatchEnd
  400. PatchMid:      cmpi.w    #2,d0
  401.                bne       PatchHigh
  402.                move.w    #200,78(a0)
  403.                move.w    #4,26(a0)
  404.                bra       PatchEnd
  405. PatchHigh:     
  406.                move.w    #2,78(a0)
  407.                move.w    #2,26(a0)
  408.  
  409. PatchEnd:      move.l    Back,-(sp)          ; Zum 'v_opnwk()' - Aufrufer
  410.                rts                           ;   zurückspringen
  411. ;################################################ GEMDOS-Trap
  412.                DC.b "XBRAOVER"
  413. OldDos:        DC.l 0
  414. MyDos:         move.w    (sp),d0             ; Je nachdem ob GEMDOS vom
  415.                btst      #13,d0              ; Supervisor- oder User-modus
  416.                bne       no_super            ; aufgerufen wurde sind die
  417.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  418.                bra       tst_term            ; Stack
  419. no_super:      lea     6(sp),a0
  420. tst_term:      cmpi.w    #Pterm0,(a0)        ; Der Overscan-Modus wird
  421.                beq       TermFound           ; NACH jedem Programm nocheinmal
  422.                cmpi.w    #Pterm,(a0)         ; neu installiert, da viele
  423.                bne       NoTerm              ; Programme den Bildschirm umsetzen
  424. TermFound:     movem.l   d0-d7/a0-a6,-(sp)   ; oder direkt beschreiben.
  425.                bsr       SetOverscan         ;
  426.                bsr       ClearScreen         ;
  427. NoClear:       movem.l   (sp)+,d0-d7/a0-a6
  428. NoTerm:        movea.l   OldDos(pc),a0
  429.                jmp       (a0)
  430. ;################################################ XBIOS-Trap
  431.                DC.b "XBRAOVER"
  432. OldXbios:      DC.l 0
  433. MyXbios:       move.w    TruePhys,d0
  434.                beq       No_Xbios
  435.                move.w    (sp),d0             ; Je nachdem ob XBIOS vom
  436.                btst      #13,d0              ; Supervisor- oder User-modus
  437.                bne       no_x_super          ; aufgerufen wurde sind die
  438.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  439.                bra       tst_phys            ; Stack
  440. no_x_super:    lea     6(sp),a0
  441. tst_phys:      cmpi.w    #Physbase,(a0)      ; Beim Physbase-Aufruf wird
  442.                beq       PhysFound           ;
  443. No_Xbios:      movea.l   OldXbios(pc),a0
  444.                jmp       (a0)
  445. PhysFound:     move.l    v_bas_add,d0        ; v_bas_add zurückgegeben
  446.                rte       
  447. ;################################################ HARDCOPY-Vec
  448.                DC.b "XBRAOVER"              ;  HARDCOPY
  449. OldHard:       DC.l 0   ;
  450. MyHard:        move.w    #-1,-(sp)           ;   Auf Shift ALT/HELP testen
  451.                move.w    #Kbshift,-(sp)      ;
  452.                trap      #bios               ;
  453.                addq.l    #4,sp               ;
  454.                cmp.b     ActivateKey,d0      ;   ja -> eigene Routine
  455.                beq       NewHard             ;
  456.                movea.l   OldHard(pc),a0      ;   nein -> alte Routine anspringen
  457.                jmp       (a0)                ;
  458. ;------------------------------------------
  459. NewHard:       movem.l   d0-d7/a0-a6,-(sp)
  460.                bsr       SetOverscan         ;     Overscan Werte nochmal setzen
  461.                bsr       ClearScreen         ;     Bilschirmränder löschen
  462. DoNotClear:    move.w    #-1,dumpflag        ;  Hardcopy-DumpFlag löschen
  463. EndHard:       movem.l   (sp)+,d0-d7/a0-a6
  464.                rts                           ; zurück
  465. ;################################################ VBL-Vektor
  466.                DC.b "XBRAOVER"              ; VerticalBlank nur bei BLITTER-TOS
  467.                DC.l 0
  468. MyVB:          tst.b     GemStarted          ; Läuft GEM schon
  469.                beq.s     MyVB_1              ; nein, raus
  470.  
  471.                movea.l   _vblqueue,a0        ; in VBL-Slot 0 schon ...
  472.                tst.l     (a0)                ; ... GEM-Mausroutine installiert ?
  473.                beq.s     MyVB_1              ; nein, raus
  474.  
  475.                pea       MyMouse(pc)         ; durch eigene Mausroutine ...
  476.                move.l    (sp)+,(a0)          ; ... ersetzen
  477.  
  478. ; ???????????????????????????
  479.                movea.l   MouseVec,a0
  480.                cmpi.l    #$fcfe82,(a0)
  481.                bne.s     MyVB_1
  482.                move.w    sr,-(sp)
  483.                ori.w     #$700,sr
  484.                move.l    #$fcfe8c,(a0)
  485.                move.w    (sp)+,sr
  486. MyVB_1:        rts       
  487. ;################################################ MOUSE-Vektor
  488.                DC.b "XBRAOVER"              ; MouseVec nur bei BLITTER-TOS
  489.                DC.l 0
  490. MyMouse:       move.w    sr,-(sp)            ; Alte Interruptmaske merken
  491.                ori.w     #$0700,sr           ; alle Interrupts sperren
  492.  
  493.                movea.l   LineA,a0            ; Zeiger auf LineA Variablen
  494.                bclr      #0,CUR_FLAG(a0)     ; !0 -> Maus neu zeichnen ?
  495.                beq.s     MyMouse_2           ; nein, raus
  496.  
  497.                clr.l     d0
  498.                clr.l     d1
  499.                move.w    CUR_X(a0),d0        ; Maus X-Position holen
  500.                move.w    CUR_Y(a0),d1        ; Maus Y-Position holen
  501.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  502.                tst.b     MOUSE_FLAG(a0)      ; !0 -> Mausinterrupt ein ?
  503.                bne.s     MyMouse_1           ; ja, raus
  504.  
  505.                movem.w   d0/d1,-(sp)         ; Register retten
  506.  
  507.                lea     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  508.                bsr       UndrawSprite        ; Mauszeiger löschen
  509.  
  510.                movem.w   (sp)+,d0/d1         ; Register restaurieren
  511.  
  512.                movea.l   LineA,a0
  513.                lea     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  514.                lea     M_POS_HX(a0),a0     ; SDB-Zeiger für LineA-MausSprite
  515.                bsr       DrawSprite          ; Mauszeiger neu zeichnen
  516. MyMouse_1:     
  517.                rts                           ; raus
  518. MyMouse_2:     
  519.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  520.                rts                           ; raus
  521.  
  522.  
  523. ;#############################################################
  524. ;#
  525. ;# Die wichtigsten Unterprogramme
  526. ;# ------------------------------
  527. ;#     SetOverscan       LineA und Auflösung initialisieren
  528. ;#     ClearScreen       Nur BildschirmRänder auf Schwarz
  529. ;#     ClearFullScreen   Ganzen Bildschirmspeicher löschen
  530. ;#
  531. ;#############################################################
  532.  
  533. SetOverscan:   clr.l     d2
  534.                move.b    sshiftmd,d2         ; Aktuelle Aufösung
  535.                move.w    d2,Reso             ;    merken
  536.                add.w     d2,d2               ; mal 2 als Word-Offset in Tabelle
  537.                lea     ScreenTab(pc),a0    ; TabellenZeiger holen
  538.                move.w    0(a0,d2.w),RezX     ; X-Auflösung
  539.                move.w    6(a0,d2.w),RezY     ; Y-Auflösung
  540.                move.w    12(a0,d2.w),B_pl     ; Bytes pro Zeile
  541.                add.w     d2,d2               ; mal 2 als Long-Offset
  542.                move.l    18(a0,d2.w),d0      ; Offset  MEMTOP <> VIDEO_ADD
  543.                move.l    30(a0,d2.w),d1      ; Offset  MEMTOP <> V_BAS_ADD
  544.                move.w    d1,Offset           ; merken
  545. ;----------------------------  Videoaddresse auf 'memtop + D0'
  546.                move.l    MyMemtop,v_bas_add
  547.                tst.b     BadTos              ; Bei BlitterTOS
  548.                beq       no_buff_1           ;     hinter Sicherheits-
  549.                addi.l    #32768,v_bas_add    ;     Puffer beginnen
  550. no_buff_1:     
  551.                add.l     d0,v_bas_add
  552.                move.b    v_bas_add+1,vid_bashigh  ; Addresse setzen
  553.                move.b    v_bas_add+2,vid_basmid
  554.                move.l    v_bas_add,VidAdd    ;       und merken
  555. ;----------------------------  v_bas_ad auf 'memtop + D1' setzen
  556.                move.l    MyMemtop,v_bas_add
  557.                tst.b     BadTos              ; Bei BlitterTOS
  558.                beq       no_buff_2           ;     hinter Sicherheitspuffer
  559.                addi.l    #32768,v_bas_add    ;
  560. no_buff_2:     
  561.                add.l     d1,v_bas_add        ;         v_bas_add setzen
  562.                move.l    v_bas_add,BasAdd    ;         und merken
  563. ;--------------- Werte in den negativen LineA Variablen anpassen
  564.                movea.l   LineA,a0            ; LineA Zeiger holen
  565.                move.w    RezX,v_rez_hz(a0)   ; Breite setzen
  566.                move.w    RezX,WKXRez(a0)     ;
  567.                subi.w    #1,WKXRez(a0)       ; Breite-1
  568.                move.w    RezY,v_rez_vt(a0)   ; Höhe   setzen
  569.                move.w    RezY,WKYRez(a0)     ;
  570.                subi.w    #1,WKYRez(a0)       ; Höhe-1
  571.                move.w    B_pl,bytes_lin(a0)   ; Bytes pro Zeile setzen
  572.                move.w    B_pl,width(a0)       ;
  573.                move.w    RezX,d0             ;
  574.                asr.w     #3,d0               ;
  575.                subq.w    #1,d0               ; Breite/8 -1
  576.                move.w    d0,v_cel_mx(a0)     ; -> Anzahl Buchstaben pro Zeile
  577.                clr.l     d0                  ;
  578.                move.w    RezY,d0             ;
  579.                divu    v_cel_ht(a0),d0     ;
  580.                subq.w    #1,d0               ; Höhe/Buchstabenhöhe -1
  581.                move.w    d0,v_cel_my(a0)     ; -> Anzahl Buchstabenzeilen
  582.                move.w    v_cel_ht(a0),d0     ;
  583.                mulu    B_pl,d0              ; AnzBuchstaben*BytesProZeile
  584.                move.w    d0,v_cel_wr(a0)     ; -> Blocklänge für Scrolling
  585.                move.w    v_planes(a0),VPlanes     ; Anzahl der Farbebenen
  586.                tst.b     BadTos              ; BLITTER-TOS ?
  587.                beq       setLineA_1          ; nein -> fertig
  588. ;-----------------------------
  589.                move.w    #3,MonPLine
  590.                move.b    sshiftmd,d0
  591.                cmpi.b    #1,d0
  592.                bgt       setLineA_1
  593.                move.w    #2,MonPLine
  594.                tst.b     d0
  595.                bne       setLineA_1
  596.                move.w    #1,MonPLine
  597. setLineA_1:    bsr       ResetCursor         ; Neue CursorAddresse bestimmen
  598.                rts       
  599. ;-----------------------------
  600. CallSetOverscan:         
  601.                move.w    sr,d0
  602.                btst      #13,d0
  603.                beq       DoCallOver
  604.                bra       SetOverscan
  605. DoCallOver:    pea       SetOverscan(pc)     ; im
  606.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  607.                trap      #xbios              ;
  608.                addq.l    #6,sp
  609.                rts       
  610. ;#############################################################
  611. ClearScreen:   bsr       BlackColor          ; Löschfarbe holen in D0
  612.                move.l    d0,d4               ;
  613. ;-----------------------------
  614.                movea.l   VidAdd,a1           ; Oberen Rand löschen
  615.                movea.l   BasAdd,a0           ;
  616.                subq.l    #2,a0               ; Falls HIGH_OFF nicht /4 teilbar
  617. Hflp:          move.l    d4,(a1)+            ; Vor dem Bildschirm Rücklauf
  618.                cmpa.l    a0,a1               ; Pixel auf Schwarz setzen
  619.                blt       Hflp                ;
  620. ;-----------------------------
  621.                move.w    Reso,d5             ;
  622.                movea.l   BasAdd,a0           ; Links & Rechts im Rücklauf löschen
  623.                clr.l     d0                  ; Den ungenutzten Bereich im
  624.                clr.l     d1                  ; Rücklauf auf Schwarz setzen
  625.                move.w    B_pl,d0              ; Bytes pro Zeile - Pixel/xxx
  626.                move.w    RezX,d1             ;
  627.                addq.w    #1,d5
  628.                asr.w     d5,d1               ;   >>3:High  >>2:Mid  >>1:Low
  629.                sub.w     d1,d0               ;
  630.                move.w    RezY,d2             ; Höhe des Bereichs
  631.                subq.w    #1,d2               ;
  632.                subq.w    #1,d0               ;
  633. Hlp1:          adda.l    d1,a0               ; Normalen Bildbereich überspringen
  634.                move.w    d0,d3               ;
  635. Hlp2:          move.b    d4,(a0)+            ; Bereich löschen
  636.                dbf       d3,Hlp2             ;
  637.                dbf       d2,Hlp1             ;
  638. ;-----------------------------
  639.                move.l    a0,d0               ; Unteren Bildrand löschen
  640.                bclr      #0,d0               ; Zeiger auf gerade Addresse
  641.                movea.l   d0,a0               ; bringen
  642.                move.l    MemEnd,d1           ; Anzahl der zulöschenden Blöcke
  643.                sub.l     d0,d1               ; Speicherende minus ZeigerAddr
  644.                asr.l     #4,d1               ; durch 16 (Blocklänge)
  645.                subq.l    #1,d1               ; minus 1 (wegen dbf)
  646. ;-----------------------------
  647. Hlp3:          move.l    d4,(a0)+            ; auf Schwarz löschen
  648.                move.l    d4,(a0)+            ;
  649.                move.l    d4,(a0)+            ;
  650.                move.l    d4,(a0)+            ;
  651.                dbf       d1,Hlp3             ;
  652.                rts                           ; fertig
  653. ;-----------------------------
  654. CallClearScreen:         
  655.                move.w    sr,d0
  656.                btst      #13,d0
  657.                beq       DoCallClearSc
  658.                bra       ClearScreen
  659. DoCallClearSc: pea       ClearScreen(pc)     ; im
  660.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  661.                trap      #xbios              ;
  662.                addq.l    #6,sp
  663.                rts       
  664. ;#############################################################
  665. ; Gesamten Bildspeicher löschen (auf schwarz)
  666. ; Löschfarbe bestimmen
  667. ClearFullScreen:         
  668.                bsr       BlackColor          ; Löschwert holen in D0
  669.                move.l    #$8000,d1           ; Länge des alten Bildschirmspeichers
  670.                addi.l    #add_len,d1         ; plus Erweiterung
  671.                lsr.l     #4,d1               ; geteilt durch 16L
  672.                subq.l    #1,d1               ; minus 1 wegen dbf
  673. ;-----------------------------
  674.                movea.l   MyMemtop,a0         ; ab MEMTOP löschen
  675.                tst.b     BadTos              ; BlitterTOS ?
  676.                beq       sc_clp              ; Sicherheitspuffer beachten
  677.                adda.l    #32768,a0           ; alte Länge
  678. ;-----------------------------
  679. sc_clp:        move.l    d0,(a0)+            ;
  680.                move.l    d0,(a0)+            ;
  681.                move.l    d0,(a0)+            ;
  682.                move.l    d0,(a0)+            ;
  683.                dbf       d1,sc_clp           ; die nächsten 16 Bytes
  684.                bsr       ResetCursor
  685.                rts                           ; fertig
  686. ;-----------------------------
  687. CallClearFull: 
  688.                move.w    sr,d0
  689.                btst      #13,d0
  690.                beq       DoCallClearFu
  691.                bra       ClearFullScreen
  692. DoCallClearFu: pea       ClearFullScreen(pc) ; im
  693.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  694.                trap      #xbios              ;
  695.                addq.l    #6,sp
  696.                rts       
  697. ;-----------------------------
  698. BlackColor:    move.l    #-1,d0              ; erstmal Füllwert $FFFFFFFF
  699.                move.w    Reso,d1             ; Bildschirmmodus ...
  700.                cmpi.w    #2,d1               ; ... Monochrom ?
  701.                bne       NotWhite            ; nein, weiter
  702.                btst      #0,$ff8241          ; Inverse Monochrome ?
  703.                bne       NotWhite            ; nein, Farbe richtig
  704.                not.l     d0                  ; sonst Füllwert $0
  705. NotWhite:      rts       
  706. ;-----------------------------
  707. CallBlackColor:          
  708.                move.w    sr,d0
  709.                btst      #13,d0
  710.                beq       DoCallBlackCo
  711.                bra       BlackColor
  712. DoCallBlackCo: pea       BlackColor(pc)      ; im
  713.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  714.                trap      #xbios              ;
  715.                addq.l    #6,sp
  716.                rts       
  717. ;#############################################################
  718. ; Retten des alten SchirmInhaltes in den neuen OVERSCAN Bildschirm
  719. ;
  720. ScreenSave:    movem.l   d0-d7/a0-a6,-(sp)   ;
  721.                movea.l   StartBasAdd,a0      ; Bildschirmspeicher kurz
  722.                movea.l   MyMemtop,a1         ; vor MemTop kopieren !
  723.                suba.l    #$8000,a1           ;
  724.                move.l    #1000,d0
  725. ScSaveLoop:    movem.l   (a0)+,d1-d7/a2
  726.                movem.l   d1-d7/a2,(a1)
  727.                lea     32(a1),a1           ; 32 Bytes transportieren
  728.                dbf       d0,ScSaveLoop
  729.                movem.l   (sp)+,d0-d7/a0-a6
  730.                rts       
  731. ;---------------------------------------------------------
  732. ScreenCopy:    movem.l   d0-d7,-(sp)         ;
  733.                movea.l   BasAdd,a0           ; Bildschirmspeicher wieder
  734.                movea.l   MyMemtop,a1         ; zurückkopieren
  735.                suba.l    #$8000,a1           ;
  736.                move.w    #160,d0             ; Alte Breite in BYTE D0
  737.                move.w    #200,d1             ; Alte Höhe            D1
  738.                cmpi.w    #2,Reso             ;
  739.                bne       CopyNoHigh          ;
  740.                move.w    #80,d0              ; High-Reso
  741.                move.w    #400,d1             ;
  742. CopyNoHigh:    clr.l     d2                  ;
  743.                move.w    B_pl,d2              ; Neue Bytes Pro Line  D3
  744.                sub.w     d0,d2               ; Differenz Neue-Alte
  745.                asr.w     #2,d0               ; /4 -> Longs
  746.                subq.w    #1,d0               ; wegen dbf -> LONGs to copy
  747.                subq.w    #1,d1               ; Lines to Copy
  748.                subq.w    #1,d2               ; Rest zu löschen
  749.  
  750. CopyLoop:      move.w    d0,d3               ;
  751. Copy_1:        move.l    (a1)+,(a0)+         ; Alten Schirm kopieren
  752.                dbf       d3,Copy_1           ;
  753.                move.w    d2,d3               ;
  754. Copy_2:        clr.b     (a0)+               ;
  755.                dbf       d3,Copy_2           ; Zeile bis Ende löschen
  756.                dbf       d1,CopyLoop         ;
  757.  
  758.                bsr       CallClearScreen
  759.                bsr       ResetCursor         ; CursorAddr bestimmen
  760.                movem.l   (sp)+,d0-d7
  761.                rts       
  762. ;#####################################################################
  763. ; Neue CursorAddresse bestimmen
  764. ;
  765. ResetCursor:   movea.l   LineA,a0            ;
  766.                move.l    BasAdd,v_cur_add(a0)     ;  Neue Addresse
  767.                move.w    v_cur_y(a0),d0      ;    = V_bas_add
  768.                mulu    v_cel_wr(a0),d0     ;
  769.                add.l     d0,v_cur_add(a0)    ;      + y * cel_wr
  770.                move.w    v_cur_x(a0),d0      ;
  771.                bclr    #0,d0               ;      + x^1 * v_planes
  772.                mulu    v_planes(a0),d0     ;
  773.                add.l     d0,v_cur_add(a0)    ;      + x^1 * planes
  774.                move.w    v_cur_x(a0),d0      ;
  775.                andi.l    #$fffe,d0           ;
  776.                add.w     d0,v_cur_add(a0)    ;      + x&1
  777.                clr.l     d0                  ;
  778.                move.w    v_cur_of(a0),d0     ;
  779.                add.l     d0,v_cur_add(a0)    ;      + cursor_offset
  780.                rts       
  781. ;#############################################################
  782. ;#
  783. ;# INTRO GrowBox Effekt und Sound
  784. ;#
  785. ;#############################################################
  786.  
  787. Intro:         bsr       ScreenSave
  788.                pea       SoundTab(pc)        ; Sound abspielen
  789.                move.w    #Dosound,-(sp)
  790.                trap      #xbios
  791.                addq.l    #6,sp
  792. ;-----------------------------
  793.                clr.w     d0
  794.                bsr       set_color
  795.                move.w    Reso,d5             ; Aktuelle Aufösung
  796.                add.w     d5,d5               ; mal 2 als Word-Offset in Tabelle
  797.                lea     ScreenTab(pc),a0
  798.                move.w    RezX,d6             ; D6 = (Breite - AlteBreite)/2
  799.                cmp.w     42(a0,d5.w),d6      ; Neue Breite kleiner als Alte ?
  800.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  801.                sub.w     42(a0,d5.w),d6
  802.                asr.w     #1,d6
  803.                move.w    d6,d0               ; als X1
  804.                move.w    d0,d2
  805.                add.w     42(a0,d5.w),d2      ; X2 = X1 + AlteAuflösung
  806.                move.w    RezY,d7             ; D7 = (Höhe   - AlteHöhe  )/2
  807.                cmp.w     48(a0,d5.w),d7      ; Neue Höhe kleiner als Alte ?
  808.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  809.                sub.w     48(a0,d5.w),d7
  810.                asr.w     #1,d7
  811.                move.w    d7,d1               ; als Y1
  812.                move.w    d1,d3
  813.                add.w     48(a0,d5.w),d3      ; Y2 = Y1 + AlteAuflösung
  814.                move.w    d6,Dx               ; Alle Werte abspeichern
  815.                move.w    d7,Dy               ;
  816.                move.w    d0,Xa               ;
  817.                move.w    d1,Ya               ;
  818.                move.w    d2,Xe               ;
  819.                move.w    d3,Ye               ;
  820.  
  821.                movem.l   d0-d7/a0-a6,-(sp)
  822.                bsr       CallClearFull
  823.                movem.l   (sp)+,d0-d7/a0-a6
  824.  
  825.                bsr       draw_rect           ; Das gefüllte Rechteck zeichnen
  826. ;-------------------------------------------------------------
  827.                move.w    d6,Max              ; In welche Richtung ist der
  828.                cmp.w     d6,d7               ; Zugewinn am größten ?
  829.                blt       grow_box            ;
  830.                move.w    d7,Max              ;
  831. grow_box:      move.w    #1,d6               ; Zaehler
  832. grow_loop:     
  833.                clr.w     d7                  ; Schleife für die größer werdenden
  834.                move.w    Dx,d4               ; Rechtecke. Die Bewegung soll
  835.                mulu    d6,d4               ; proportional verlaufen...
  836.                divu    Max,d4              ; ...deswegen der ganze Hermann
  837.                move.w    Dy,d5               ;
  838.                mulu    d6,d5
  839.                divu    Max,d5
  840.  
  841.                cmpi.w    #0,d0               ; X links oben
  842.                beq       no_d0
  843.                move.w    Xa,d0
  844.                sub.w     d4,d0
  845.                addq.w    #1,d7
  846. no_d0:         cmpi.w    #0,d1               ; Y links oben
  847.                beq       no_d1
  848.                move.w    Ya,d1
  849.                sub.w     d5,d1
  850.                addq.w    #1,d7
  851. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  852.                beq       no_d2
  853.                move.w    Xe,d2
  854.                add.w     d4,d2
  855.                addq.w    #1,d7
  856. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  857.                beq       no_d3
  858.                move.w    Ye,d3
  859.                add.w     d5,d3
  860.                addq.w    #1,d7
  861. no_d3:         bsr       draw_box            ; das Rechteck zeichnen
  862. ;-----------------------------
  863.                addq.w    #1,d6               ;
  864.                tst.w     d7                  ; Solange sich noch was ändert
  865.                bne       grow_loop           ; die Rechteckschleife wiederholen
  866.  
  867. EndIntro:      bsr       ResetCursor
  868.                bra       ScreenCopy
  869.  
  870. ;-----------------------------
  871. set_color:     movea.l   LineA,a0            ; Farbe setzen
  872.                move.w    d0,col_bit0(a0)     ;
  873.                move.w    d0,col_bit1(a0)     ;
  874.                move.w    d0,col_bit2(a0)     ;
  875.                move.w    d0,col_bit3(a0)     ;
  876.                rts       
  877. ;---------------------------------
  878. draw_box:      movea.l   LineA,a0            ; Ein Rechteck aus Linien zeichnen
  879.                clr.w     wmode(a0)           ; d0/d1 linke  obere  Ecke
  880.                move.w    #$ffff,lnmask(a0)   ; d2/d3 rechte untere Ecke
  881.                move.w    #1,lstlin(a0)
  882.                move.w    d0,x1(a0)
  883.                move.w    d1,y1(a0)
  884.                move.w    d2,x2(a0)
  885.                move.w    d1,y2(a0)
  886.                bsr       draw_line           ; Oben
  887.                movea.l   LineA,a0
  888.                move.w    d2,x1(a0)
  889.                move.w    d1,y1(a0)
  890.                move.w    d2,x2(a0)
  891.                move.w    d3,y2(a0)
  892.                bsr       draw_line           ; Rechts
  893.                movea.l   LineA,a0
  894.                move.w    d2,x1(a0)
  895.                move.w    d3,y1(a0)
  896.                move.w    d0,x2(a0)
  897.                move.w    d3,y2(a0)
  898.                bsr       draw_line           ; Unten
  899.                movea.l   LineA,a0
  900.                move.w    d0,x1(a0)
  901.                move.w    d1,y1(a0)
  902.                move.w    d0,x2(a0)
  903.                move.w    d3,y2(a0)
  904.                bsr       draw_line           ; Links
  905.                rts       
  906. ;-----------------------------
  907. draw_diag:     movea.l   LineA,a0            ; Diagonalen zeichnen
  908.                move.w    d0,x1(a0)           ;
  909.                move.w    d1,y1(a0)           ; Parameter wie oben
  910.                move.w    d2,x2(a0)           ;
  911.                move.w    d3,y2(a0)
  912.                bsr       draw_line           ; Diagonale links
  913.                movea.l   LineA,a0
  914.                move.w    d2,x1(a0)
  915.                move.w    d1,y1(a0)
  916.                move.w    d0,x2(a0)
  917.                move.w    d3,y2(a0)
  918.                bsr       draw_line           ; Diagonale rechts
  919. EndBox:        rts       
  920. ;-----------------------------
  921. draw_line:     movem.l   d0-d7,-(sp)         ; Einzelne Linie Ziehen
  922.                DC.w $a003
  923.                movem.l   (sp)+,d0-d7
  924.                rts       
  925. ;-----------------------------
  926. pattern:       DC.w $ffff                   ; Fuellmuster
  927. ;-----------------------------
  928. draw_rect:     movem.l   d0-d7,-(sp)         ; Ein Rechteck zeichnen
  929.                movea.l   LineA,a0            ;
  930.                move.w    #1,mfill(a0)        ; d0/d1 linke  obere  Ecke
  931.                clr.w     wmode(a0)           ; d2/d3 rechte untere Ecke
  932.                move.w    d0,x1(a0)
  933.                move.w    d1,y1(a0)
  934.                move.w    d2,x2(a0)
  935.                move.w    d3,y2(a0)
  936.                lea     pattern(pc),a1
  937.                move.l    a1,patptr(a0)
  938.                move.w    #1,patmsk(a0)
  939.                clr.w     clip(a0)
  940.                DC.w $a005
  941.                movem.l   (sp)+,d0-d7
  942.                rts       
  943.  
  944. ;#############################################################
  945. ;#
  946. ;# OVERSCAN - Einstellung
  947. ;#
  948. ;#############################################################
  949.  
  950. UserInstall:   bsr       UserInit            ; Initialisieren
  951. UserLoop:      move.w    #0,d0               ; Wiederhole
  952.                bsr       DrawSetup           ;
  953.                bsr       WriteSetup          ;     Zeichne Kreuz und Werte
  954.                bsr       GetKey              ;     Hole Taste
  955.                move.w    #1,d0               ;
  956.                bsr       DrawSetup           ;     Lösche Kreuz
  957.                bsr       ChangeSetup         ;     Bearbeite Taste
  958.                tst.w     UserSave            ;
  959.                beq       UserLoop            ; Bis EndeFlag gesetzt
  960.                bra       UserExit            ; Meldung ausgeben
  961. ;------------------------------------------------------------
  962. UserInit:      bsr       CallClearFull       ; Schirm löschen
  963.                bsr       CallClearPal        ; Farbregister 3 löschen
  964.                move.w    Reso,ResoSave       ; Startauflösung merken
  965.                bsr       InitReso
  966.                clr.w     UserSave
  967.                bsr       Do_Help             ; HilfsText
  968.                bra       CallClearFull       ; und wieder schwarz
  969. ;--------------------------------------------
  970. UserExit:      pea       msg_erase(pc)       ; Bildschirm löschen & CursorHome
  971.                move.w    #Cconws,-(sp)       ;
  972.                trap      #gemdos             ;
  973.                addq.l    #6,sp               ;
  974.                move.w    UserSave,d0
  975.                cmpi.w    #1,d0               ; 1 -> Nicht gespeichert
  976.                bne       tstNotFound
  977.                pea       msg_nosave(pc)      ;
  978.                move.w    #Cconws,-(sp)
  979.                trap      #gemdos
  980.                addq.l    #6,sp
  981.                bra       UserContinue
  982. ;----------------------
  983. tstNotFound:   cmpi.w    #2,d0               ; 2 -> Datei nicht gefunden
  984.                bne       Saved               ;
  985.                pea       save_name(pc)       ; Datei-Name ausgeben
  986.                move.w    #Cconws,-(sp)       ;
  987.                trap      #gemdos             ;
  988.                addq.l    #6,sp               ;
  989.                pea       msg_notfound(pc)    ;
  990.                move.w    #Cconws,-(sp)
  991.                trap      #gemdos
  992.                addq.l    #6,sp
  993.                move.w    #Cnecin,-(sp)       ; Tastendruck abwarten
  994.                trap      #gemdos
  995.                addq.l    #2,sp
  996.                bra       UserContinue
  997. ;--------------------------
  998. Saved:         pea       msg_save(pc)        ; 3 -> Alles gespeichert
  999.                move.w    #Cconws,-(sp)
  1000.                trap      #gemdos
  1001.                addq.l    #6,sp
  1002. UserContinue:  move.w    Reso,d0
  1003.                cmp.w     ResoSave,d0
  1004.                bne       NoRestorePal
  1005.                bsr       CallRestorePal      ; Farbregister 3 zurück
  1006. NoRestorePal:  rts       
  1007. ;-----------------------------
  1008. GetKey:        move.w    #Cnecin,-(sp)
  1009.                trap      #gemdos
  1010.                addq.l    #2,sp
  1011.                swap    d0                  ; ScanCode
  1012.                move.w    d0,UserKey
  1013.                rts       
  1014. ;-----------------------------
  1015. ChangeSetup:   move.w    UserKey,d0          ; Auf Tastendruck reagieren
  1016.                cmpi.w    #16,d0              ; Q
  1017.                bne       NoQ
  1018.                move.w    #1,UserSave
  1019.                bra       ChangeClear
  1020. NoQ:           cmpi.w    #31,d0              ; S
  1021.                bne       NoS
  1022.                bra       Do_Save
  1023. NoS:           cmpi.w    #98,d0              ; Help
  1024.                bne       NoHelp
  1025.                bsr       Do_Help
  1026.                bra       ChangeClear
  1027. NoHelp:        cmpi.w    #75,d0              ; LinksPfeil
  1028.                bne       NoLeft
  1029.                bra       Do_Left
  1030. NoLeft:        cmpi.w    #77,d0              ; RechtsPfeil
  1031.                bne       NoRight
  1032.                bra       Do_Right
  1033. NoRight:       cmpi.w    #72,d0              ; RaufPfeil
  1034.                bne       NoUp
  1035.                bra       Do_Up
  1036. NoUp:          cmpi.w    #80,d0              ; RunterPfeil
  1037.                bne       NoDown
  1038.                bra       Do_Down
  1039. NoDown:        cmpi.w    #101,d0             ; /
  1040.                bne       NoDiv
  1041.                bsr       Do_Div
  1042.                bra       ChangeClear
  1043. NoDiv:         cmpi.w    #102,d0             ; *
  1044.                bne       NoMul
  1045.                bsr       Do_Mul
  1046.                bra       ChangeClear
  1047. NoMul:         cmpi.w    #74,d0              ; -
  1048.                bne       NoSub
  1049.                bsr       Do_Sub
  1050.                bra       ChangeClear
  1051. NoSub:         cmpi.w    #78,d0              ; +
  1052.                bne       NoAdd
  1053.                bsr       Do_Add
  1054.                bra       ChangeClear
  1055. NoAdd:         cmpi.w    #25,d0              ; P
  1056.                bne       no_op
  1057.                bsr       Do_Phys
  1058.                bra       ChangeClear
  1059. no_op:           cmpi.w    #46,d0              ; C
  1060.                bne       NoC
  1061.                bsr       Do_Activ
  1062.                bra       ChangeClear
  1063. NoC:           cmpi.w    #35,d0              ; H
  1064.                bne       NoH
  1065.                bsr       ResoChangeTest
  1066.                bne       ChangeClear
  1067.                move.w    #2,d0
  1068.                bra       SetScreenReso
  1069. NoH:           cmpi.w    #50,d0              ; M
  1070.                bne       NoM
  1071.                bsr       ResoChangeTest
  1072.                bne       ChangeClear
  1073.                move.w    #1,d0
  1074.                bra       SetScreenReso
  1075. NoM:           cmpi.w    #38,d0              ; L
  1076.                bne       EndChange
  1077.                bsr       ResoChangeTest
  1078.                bne       ChangeClear
  1079.                move.w    #0,d0
  1080.                bra       SetScreenReso
  1081.  
  1082. EndChange:     rts       
  1083. ChangeClear:   bra       CallClearFull
  1084. ;----------------------------------------------
  1085. ClearPal:      move.w    vid_pal3,Pal3Save   ; Farbregister 3 retten
  1086.                move.w    vid_palF,PalFSave
  1087.                clr.w     vid_pal3            ; auf schwarz setzen
  1088.                clr.w     vid_palF
  1089.                rts       
  1090. CallClearPal:  move.w    sr,d0
  1091.                btst      #13,d0
  1092.                beq       DoCallClearPa
  1093.                bra       ClearPal
  1094. DoCallClearPa: pea       ClearPal(pc)        ; Farbregister 3 löschen
  1095.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1096.                trap      #xbios              ;
  1097.                addq.l    #6,sp
  1098.                rts       
  1099. ;----------------------------------------------
  1100. RestorePal:    move.w    Pal3Save,vid_pal3   ; Farbregister 3 zurück
  1101.                move.w    PalFSave,vid_palF
  1102.                rts       
  1103. CallRestorePal:          
  1104.                move.w    sr,d0
  1105.                btst      #13,d0
  1106.                beq       DoCallRestore
  1107.                bra       RestorePal
  1108. DoCallRestore: pea       RestorePal(pc)      ; Farbregister 3 löschen
  1109.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1110.                trap      #xbios              ;
  1111.                addq.l    #6,sp
  1112.                rts       
  1113. ;----------------------------------------------
  1114. InitReso:      move.w    #8,Y_Inc
  1115.                move.w    Reso,d0             ; Aktuelle Auflösung
  1116.                cmpi.w    #2,d0               ;
  1117.                bne       NoHighReso          ;
  1118.                move.w    #16,Y_Inc           ;     Y-Inkrement feststellen
  1119. ;-----------------------------
  1120. NoHighReso:    move.l    #8,d1               ;
  1121.                tst.w     d0
  1122.                beq       InitOffset
  1123.                asr.l     d0,d1               ;
  1124. InitOffset:    move.l    d1,Off_Inc          ;     Offset-Inkrement festlegen
  1125. ;-----------------------------
  1126.                clr.l     d1                  ;     Max X/Y feststellen
  1127.                move.w    d0,d1               ;
  1128.                addq.w    #1,d1               ;
  1129.                move.w    #1,d2               ;
  1130.                asl.w     d1,d2               ; 1 << (Reso+)
  1131.                mulu    B_pl,d2              ;
  1132.                move.w    d2,X_Max            ; MaxX = B_pl * 1<<(Reso+1)
  1133.                move.l    MemEnd,d1           ;
  1134.                sub.l     MyMemtop,d1         ;
  1135.                divu    B_pl,d1              ; MaxY = Speicherlänge/BytePerLine
  1136.                move.w    d1,Y_Max            ;
  1137.                move.w    #320,X_Min          ;
  1138.                move.w    #160,Y_Min          ;
  1139.                cmpi.w    #2,d0               ;
  1140.                bne       InitPointer         ;
  1141.                move.w    #320,Y_Min          ;
  1142. ;-----------------------------
  1143. InitPointer:   add.w     d0,d0               ; Words
  1144.                lea     ScreenTab(pc),a0    ;     Breite/Höhe/Offset Pointer
  1145.                lea     0(a0,d0.w),a1       ;     ermitteln
  1146.                move.l    a1,X_Add
  1147.                lea     6(a0,d0.w),a1
  1148.                move.l    a1,Y_Add
  1149.                add.w     d0,d0               ; Longs
  1150.                lea     30(a0,d0.w),a1
  1151.                move.l    a1,Off_Add
  1152.                rts       
  1153. ;-----------------------------
  1154. Do_Save:       bsr       CallClearFull       ; Schirm löschen
  1155.                move.w    #2,UserSave         ; Nicht gefunden Flag setzen
  1156.  
  1157.  
  1158.                move.w    #1,-(sp)            ; Fopen('\AUTO\OVERSCAN.PRG',1)
  1159.                pea       save_name(pc)       ;
  1160.                move.w    #Fopen,-(sp)
  1161.                trap      #gemdos             ;
  1162.                addq.l    #8,sp               ;
  1163.                tst.w     d0                  ; Gefunden ?
  1164.                bmi       EndSave             ; nein -> ende
  1165.                move.w    #3,UserSave         ; Flag setzen...
  1166.                move.w    d0,Handle           ; Dateihandle merken
  1167.                clr.w     -(sp)               ;
  1168.                move.w    Handle,-(sp)        ;     Header überlesen
  1169.                move.l    #30,-(sp)           ;
  1170.                move.w    #Fseek,-(sp)        ; Fseek(30,Handle,0)
  1171.                trap      #gemdos             ;
  1172.                lea     $a(sp),sp           ;
  1173.                pea       ScreenTab(pc)       ;     ScreenTab speichern
  1174.                move.l    #60,-(sp)           ;
  1175.                move.w    Handle,-(sp)        ;
  1176.                move.w    #Fwrite,-(sp)       ; Fwrite(Handle,60L,ScreenTab)
  1177.                trap      #gemdos             ;
  1178.                lea     $c(sp),sp           ;
  1179.                move.w    Handle,-(sp)        ;
  1180.                move.w    #Fclose,-(sp)       ; Fclose(Handle)
  1181.                trap      #gemdos             ;
  1182.                addq.l    #4,sp               ;
  1183. EndSave:       rts       
  1184. ;----------------------------------------------------
  1185. Do_Help:       pea       msg_help(pc)        ; Hilfstext ausgeben
  1186.                move.w    #Cconws,-(sp)
  1187.                trap      #gemdos
  1188.                addq.l    #6,sp
  1189.                move.w    #Cnecin,-(sp)
  1190.                trap      #gemdos
  1191.                addq.l    #2,sp               ; Tastendruck abwarten
  1192.                rts       
  1193. ;-----------------------------
  1194. Do_Left:       move.w    X_Min,d0            ; Breite vermindern
  1195.                cmp.w     RezX,d0
  1196.                bge       End_Left
  1197.                movea.l   X_Add,a0
  1198.                subi.w    #16,(a0)
  1199.                bsr       CallSetOverscan
  1200. End_Left:      rts       
  1201. ;-----------------------------
  1202. Do_Right:      move.w    X_Max,d0            ; Breite erhöhen
  1203.                cmp.w     RezX,d0
  1204.                ble       End_Right
  1205.                movea.l   X_Add,a0
  1206.                addi.w    #16,(a0)
  1207.                bsr       CallSetOverscan
  1208. End_Right:     rts       
  1209. ;-----------------------------
  1210. Do_Up:         move.w    Y_Min,d0            ; Höhe vermindern
  1211.                cmp.w     RezY,d0
  1212.                bge       End_Up
  1213.                movea.l   Y_Add,a0
  1214.                move.w    Y_Inc,d0
  1215.                sub.w     d0,(a0)
  1216.                bsr       CallSetOverscan
  1217. End_Up:        rts       
  1218. ;-----------------------------
  1219. Do_Down:       move.w    Y_Max,d0            ; Höhe erhöhen
  1220.                cmp.w     RezY,d0
  1221.                ble       End_Down
  1222.                movea.l   Y_Add,a0
  1223.                move.w    Y_Inc,d0
  1224.                add.w     d0,(a0)
  1225.                bsr       CallSetOverscan
  1226. End_Down:      rts       
  1227. ;-----------------------------
  1228. Do_Div:        movea.l   Off_Add,a0          ; Offset vermindern
  1229.                move.l    Off_Inc,d0          ; Linke obere Ecke nach links
  1230.                sub.l     d0,(a0)
  1231.                bra       CallSetOverscan
  1232. ;-----------------------------
  1233. Do_Mul:        movea.l   Off_Add,a0          ; Offset erhöhen
  1234.                move.l    Off_Inc,d0          ; Linke obere Ecke nach rechts
  1235.                add.l     d0,(a0)
  1236.                bra       CallSetOverscan
  1237. ;-----------------------------
  1238. Do_Sub:        movea.l   Off_Add,a0          ; Offset erhöhen
  1239.                clr.l     d0
  1240.                move.w    B_pl,d0              ; Linke obere Ecke nach oben
  1241.                sub.l     d0,(a0)
  1242.                bra       CallSetOverscan
  1243. ;-----------------------------
  1244. Do_Add:        movea.l   Off_Add,a0          ; Offset erhöhen
  1245.                clr.l     d0
  1246.                move.w    B_pl,d0              ; Linke obere Ecke nach unten
  1247.                add.l     d0,(a0)
  1248.                bra       CallSetOverscan
  1249. ;-----------------------------
  1250. Do_Phys:       move.w    TruePhys,d0         ; Den jetzigen Zustand ausgeben
  1251.                tst.w     d0
  1252.                bne       PhysIsOn
  1253.                pea       msg_phys_on(pc)
  1254.                bra       Write_phys
  1255. PhysIsOn:      pea       msg_phys_off(pc)
  1256. Write_phys:    move.w    #Cconws,-(sp)
  1257.                trap      #gemdos
  1258.                addq.l    #6,sp
  1259.                move.w    #Cnecin,-(sp)
  1260.                trap      #gemdos
  1261.                addq.l    #2,sp
  1262.                swap    d0
  1263.                cmpi.w    #44,d0              ; Nur bei 'Y'
  1264.                bne       EndPhys
  1265.                not.w     TruePhys            ; -> Zustand ändern
  1266. EndPhys:       rts       
  1267. ;-----------------------------
  1268. Do_Activ:      move.b    ActivateKey,d0      ; Den jetzigen Zustand ausgeben
  1269.                cmpi.b    #9,d0
  1270.                beq       ActivShift
  1271.                pea       msg_shift_off(pc)
  1272.                bra       Write_Shift
  1273. ActivShift:    pea       msg_shift_on(pc)
  1274. Write_Shift:   move.w    #Cconws,-(sp)
  1275.                trap      #gemdos
  1276.                addq.l    #6,sp
  1277.                move.w    #Cnecin,-(sp)
  1278.                trap      #gemdos
  1279.                addq.l    #2,sp
  1280.                swap    d0
  1281.                cmpi.w    #49,d0              ; Nur bei 'N'
  1282.                bne       EndShift
  1283.                bchg      #0,ActivateKey      ; Zustand ändern
  1284. EndShift:      rts       
  1285.  
  1286. ;-----------------------------
  1287. ResoChangeTest:          
  1288.                pea       msg_change(pc)      ; Hilfstext ausgeben
  1289.                move.w    #Cconws,-(sp)
  1290.                trap      #gemdos
  1291.                addq.l    #6,sp
  1292.                move.w    #Cnecin,-(sp)
  1293.                trap      #gemdos
  1294.                addq.l    #2,sp
  1295.                swap d0
  1296.                cmpi.w    #21,d0              ; The Y key
  1297.                rts       
  1298. ;-----------------------------
  1299. SetScreenReso: move.w    d0,-(sp)            ; Neue Auflösung mit Setscreen
  1300.                move.l    #-1,-(sp)           ; setzen
  1301.                move.l    #-1,-(sp)           ;
  1302.                move.w    #Setscreen,-(sp)    ;
  1303.                trap      #xbios              ;
  1304.                lea     $c(sp),sp
  1305.                bsr       CallSetOverscan     ; Overscan neu installieren
  1306.                bsr       CallClearFull       ;
  1307.                bra       InitReso            ; und initialisieren
  1308. ;-----------------------------
  1309. DrawSetup:     bsr       set_color           ;  Box mit Diagonalen zeichnen
  1310.                move.w    #0,d0
  1311.                move.w    #0,d1
  1312.                move.w    RezX,d2
  1313.                subq.w    #1,d2
  1314.                move.w    RezY,d3
  1315.                subq.w    #1,d3
  1316.                bsr       draw_box
  1317.                bra       draw_diag
  1318. ;-----------------------------
  1319. WriteSetup:    lea     user_x(pc),a1       ;  Zahlenwerte schreiben
  1320.                move.w    RezX,d0
  1321.                bsr       WriteDec
  1322.                lea     user_y(pc),a1
  1323.                move.w    RezY,d0
  1324.                bsr       WriteDec
  1325.                lea     user_off(pc),a1
  1326.                move.w    Offset,d0
  1327.                bra       WriteHex
  1328. ;-----------------------------
  1329. WriteDec:      movem.l   d0-d7,-(sp)         ; Zahlen ausgabe in Dezimal
  1330.                lea     end_number(pc),a0   ; Alten String löschen
  1331.                move.w    #3,d2               ;
  1332. WriteClr:      move.b    #' ',-(a0)          ;
  1333.                dbf       d2,WriteClr         ;
  1334.                lea     end_number(pc),a0   ;
  1335.                swap    d0                  ; Oberen Werte löschen
  1336.                clr.w     d0
  1337.                swap    d0
  1338. WriteLp:       divu    #10,d0
  1339.                swap    d0
  1340.                move.w    d0,d1
  1341.                clr.w     d0                  ; Modulo Rest löschen
  1342.                swap    d0
  1343.                addi.w    #'0',d1
  1344.                move.b    d1,-(a0)
  1345.                tst.l     d0
  1346.                bne       WriteLp
  1347. ;-----------------------------
  1348.                move.l    a1,-(sp)            ; Text ausgeben
  1349.                move.w    #Cconws,-(sp)
  1350.                trap      #gemdos
  1351.                addq.l    #6,sp
  1352.                pea       user_number(pc)     ; Zahlzeile ausgeben
  1353.                move.w    #Cconws,-(sp)
  1354.                trap      #gemdos
  1355.                addq.l    #6,sp
  1356.                movem.l   (sp)+,d0-d7
  1357.                rts       
  1358. ;-----------------------------
  1359. WriteHex:      movem.l   d0-d7,-(sp)         ; Zahlen Ausgabe in Hexadezimal
  1360.                lea     end_number(pc),a0   ; Alten String löschen
  1361.                move.w    #3,d2
  1362. WriteHlp:      move.b    d0,d1
  1363.                andi.w    #$f,d1
  1364.                cmpi.w    #9,d1
  1365.                ble       NotAF
  1366.                subi.w    #10,d1
  1367.                addi.w    #'A',d1
  1368.                bra       WriteIt
  1369. NotAF:         addi.w    #'0',d1
  1370. WriteIt:       move.b    d1,-(a0)
  1371.                asr.w     #4,d0
  1372.                dbf       d2,WriteHlp
  1373. ;-----------------------------
  1374.                move.l    a1,-(sp)            ; Text ausgeben
  1375.                move.w    #Cconws,-(sp)
  1376.                trap      #gemdos
  1377.                addq.l    #6,sp
  1378.                pea       user_number(pc)     ; Zahlzeile ausgeben
  1379.                move.w    #Cconws,-(sp)
  1380.                trap      #gemdos
  1381.                addq.l    #6,sp
  1382.                movem.l   (sp)+,d0-d7
  1383.                rts       
  1384. ;#############################################################
  1385. ; eigene Versionen der DrawSprite und UndrawSprite Routinen
  1386. ; die nicht auf 32KB Bildschirmspeicher begrenzt sind.
  1387. ;
  1388. ; mit einigen Anpassungen für OVERSCAN
  1389. ; von Bernd Gebauer 31.05.89
  1390. ;
  1391.  
  1392. DrawSprite:    
  1393. ; Parameter
  1394. ; D0.W : X-Koordinate des Aktionspunktes des Sprites auf Schirm
  1395. ; D1.W : Y-Koordinate
  1396. ; A0   : Zeiger auf SDB-Struktur
  1397. ; A2   : Zeiger auf Sprite-Save-Buffer ( #Farbebenen*64 + 10 )
  1398.  
  1399.                move.w    6(a0),-(sp)         ; bgcol retten
  1400.                move.w    8(a0),-(sp)         ; fgcol retten
  1401.  
  1402.                clr.w     d2
  1403.                tst.w     4(a0)               ; form ( 1=VDI , -1=XOR )
  1404.                bge.s     lab_1
  1405.                moveq.l   #16,d2
  1406. lab_1:         
  1407.                move.w    d2,-(sp)            ; offset retten
  1408.  
  1409.                clr.w     d2
  1410.                bclr      #1,6(a2)
  1411.                sub.w     0(a0),d0            ; X -= xhot
  1412.                bcs.s     lab_2
  1413.  
  1414.                move.w    RezX,d3
  1415.                subi.w    #15,d3
  1416.                cmp.w     d3,d0               ; xhot > XRez-15 ?
  1417.                bhi.s     lab_4               ; ja, weiter
  1418.                bset      #1,6(a2)            ; Clipflag setzen
  1419.                bra.s     lab_3
  1420. ;-------------
  1421. lab_2:         
  1422.                addi.w    #16,d0
  1423.                moveq.l   #8,d2
  1424.                bra.s     lab_3
  1425. ;-------------
  1426. lab_4:         
  1427.                moveq.l   #16,d2
  1428. lab_3:         
  1429.  
  1430.                sub.w     2(a0),d1            ; Y -= yhot
  1431.  
  1432.                lea     10(a0),a0           ; Zeiger auf Sprite-Image 32Bytes
  1433.                bcs.s     lab_5
  1434.  
  1435.                move.w    RezY,d3
  1436.                subi.w    #15,d3
  1437.                cmp.w     d3,d1               ;
  1438.                bhi.s     lab_6
  1439.                moveq.l   #16,d5
  1440.                bra.s     lab_7
  1441. ;-------------
  1442. lab_5:         
  1443.                move.w    d1,d5
  1444.                addi.w    #16,d5
  1445.                asl.w     #2,d1
  1446.                suba.w    d1,a0
  1447.                clr.w     d1
  1448.                bra.s     lab_7
  1449. ;-------------
  1450. lab_6:         
  1451.                move.w    RezY,d5
  1452.                sub.w     d1,d5
  1453.                addq.w    #1,d5
  1454. lab_7:         
  1455. ; D0 = X , D1 = Y
  1456.                bsr       CalcScreenPos
  1457. ; D0 = X mod 15 , D1.L = offset vom Bildschirmanfang
  1458.  
  1459.                movea.l   v_bas_add,a1        ; Bildspeicheradresse
  1460.                adda.l    d1,a1               ; + offset
  1461.  
  1462.                lea     func_2,a3
  1463.                move.w    d0,d6               ; X mod 15
  1464.                cmpi.w    #8,d6               ; (X mod 15) < 8 ?
  1465.                bcs.s     lab_8               ; ja, weiter
  1466.                lea     func_1,a3
  1467.                move.w    #16,d6
  1468.                sub.w     d0,d6               ; 16 - (X mod 15)
  1469. lab_8:         
  1470.  
  1471.                movea.l   tab1(pc,d2.w),a5
  1472.                movea.l   tab1+4(pc,d2.w),a6
  1473.                move.w    VPlanes,d2
  1474.                move.w    d2,d3
  1475.                add.w     d3,d3
  1476.                move.w    B_pl,d4
  1477.                move.l    a1,2(a2)
  1478.                move.w    d5,0(a2)
  1479.                bset      #0,6(a2)
  1480.                lea     8(a2),a2
  1481.                move.l    a1,d7
  1482.                move.w    d5,d1
  1483.                bra.s     lab_9
  1484.  
  1485. ;-----------------------------------------------------
  1486.  
  1487. tab1:          
  1488.                DC.l proc_1
  1489.                DC.l proc_2
  1490.                DC.l proc_3
  1491.                DC.l proc_4
  1492.                DC.l proc_5
  1493.                DC.l proc_6
  1494.  
  1495. ;-----------------------------------------------------
  1496.  
  1497. loop_1:        
  1498.                clr.w     d0
  1499.                lsr.w     2(sp)
  1500.                addx.w    d0,d0
  1501.                lsr.w     4(sp)
  1502.                roxl.w    #3,d0
  1503.                add.w     0(sp),d0
  1504.                movea.l   tab2(pc,d0.w),a4
  1505.                movem.l   d1/d2,-(sp)
  1506.                jsr       (a6)
  1507.                movem.l   (sp)+,d1/d2
  1508.                move.w    d1,d5
  1509.                lsl.w     #2,d5
  1510.                suba.w    d5,a0
  1511.                move.w    d1,d5
  1512.                addq.l    #2,d7
  1513.                movea.l   d7,a1
  1514. lab_9:         
  1515.                dbra      d2,loop_1
  1516.                addq.l    #6,sp
  1517.                rts       
  1518.  
  1519. ;-----------------------------------------------------
  1520.  
  1521. tab2:          
  1522.                DC.l proc_7
  1523.                DC.l proc_8
  1524.                DC.l proc_9
  1525.                DC.l proc_a
  1526.                DC.l proc_b
  1527.                DC.l proc_c
  1528.                DC.l proc_d
  1529.                DC.l proc_e
  1530. ;-----------------------------------------------------
  1531.  
  1532. loop_2:        
  1533.                move.w    (a1),d2
  1534.                swap    d2
  1535.                move.w    0(a1,d3.w),d2
  1536.                move.l    d2,(a2)+
  1537.                jmp       (a3)
  1538. ;-------------
  1539. proc_1:        
  1540.                move.w    d2,0(a1,d3.w)
  1541.                swap    d2
  1542.                move.w    d2,(a1)
  1543.                adda.w    d4,a1
  1544. proc_2:        
  1545.                dbra      d5,loop_2
  1546.                rts       
  1547.  
  1548. ;-----------------------------------------------------
  1549.  
  1550. loop_3:        
  1551.                move.w    (a1),d2
  1552.                move.w    d2,(a2)+
  1553.                jmp       (a3)
  1554. ;-------------
  1555. proc_3:        
  1556.                move.w    d2,(a1)
  1557.                adda.w    d4,a1
  1558. proc_4:        
  1559.                dbra      d5,loop_3
  1560.                rts       
  1561.  
  1562. ;-----------------------------------------------------
  1563.  
  1564. loop_4:        
  1565.                move.w    (a1),d2
  1566.                move.w    d2,(a2)+
  1567.                swap    d2
  1568.                jmp       (a3)
  1569. ;-------------
  1570. proc_5:        
  1571.                swap    d2
  1572.                move.w    d2,(a1)
  1573.                adda.w    d4,a1
  1574. proc_6:        
  1575.                dbra      d5,loop_4
  1576.                rts       
  1577.  
  1578. ;-----------------------------------------------------
  1579.  
  1580. func_1:        
  1581.                moveq.l   #0,d0
  1582.                move.w    (a0)+,d0
  1583.                rol.l     d6,d0
  1584.                moveq.l   #0,d1
  1585.                move.w    (a0)+,d1
  1586.                rol.l     d6,d1
  1587.                jmp       (a4)
  1588. ;-----------------------------------------------------
  1589. func_2:        
  1590.                moveq.l   #0,d0
  1591.                move.w    (a0)+,d0
  1592.                swap    d0
  1593.                ror.l     d6,d0
  1594.                moveq.l   #0,d1
  1595.                move.w    (a0)+,d1
  1596.                swap    d1
  1597.                ror.l     d6,d1
  1598.                jmp       (a4)
  1599. ;-----------------------------------------------------
  1600. proc_7:        
  1601. ; (~(D0|D1))&D2 --> D2
  1602.                or.l      d1,d0
  1603.                not.l     d0
  1604.                and.l     d0,d2
  1605.                jmp       (a5)
  1606. ;-----------------------------------------------------
  1607. proc_8:        
  1608. ; (D0|D2)&(~D1) --> D2
  1609.                or.l      d0,d2
  1610.                not.l     d1
  1611.                and.l     d1,d2
  1612.                jmp       (a5)
  1613. ;-----------------------------------------------------
  1614. proc_9:        
  1615. ; ((~D0)&D2)|D1 --> D2
  1616.                not.l     d0
  1617.                and.l     d0,d2
  1618.                or.l      d1,d2
  1619.                jmp       (a5)
  1620. ;-----------------------------------------------------
  1621. proc_a:        
  1622. ; (D0|D1|D2) --> D2
  1623.                or.l      d0,d2
  1624.                or.l      d1,d2
  1625.                jmp       (a5)
  1626. ;-----------------------------------------------------
  1627. proc_b:        
  1628. ; (~(D1^D2))&D0 --> D2
  1629.                eor.l     d1,d2
  1630.                not.l     d0
  1631.                and.l     d0,d2
  1632.                jmp       (a5)
  1633. ;-----------------------------------------------------
  1634. proc_c:        
  1635. ; (D0|D2)^D1 --> D2
  1636.                or.l      d0,d2
  1637.                eor.l     d1,d2
  1638.                jmp       (a5)
  1639. ;-----------------------------------------------------
  1640. proc_d:        
  1641. ; ((~D0)&D2)^D1 --> D2
  1642.                not.l     d0
  1643.                and.l     d0,d2
  1644.                eor.l     d1,d2
  1645.                jmp       (a5)
  1646. ;-----------------------------------------------------
  1647. proc_e:        
  1648. ; (D0^D2)|D1 --> D2
  1649.                eor.l     d0,d2
  1650.                or.l      d1,d2
  1651.                jmp       (a5)
  1652. ;-----------------------------------------------------
  1653. UndrawSprite:  
  1654. ; A2 = Zeiger auf SpriteSaveBlock
  1655.                bclr      #0,6(a2)
  1656.                beq       lab_10              ; raus
  1657.                move.w    0(a2),d4            ; xhot
  1658.                move.w    d4,d2               ; xhot
  1659.                subq.w    #1,d2               ; xhot - 1
  1660.                move.w    B_pl,d3
  1661.                movea.l   2(a2),a0            ; Zeiger auf Bildschirmoffset
  1662.                lea     8(a2),a1            ; Zeiger auf Spritedaten
  1663.                move.w    VPlanes,d5
  1664.                subq.w    #2,d5
  1665.                bhi.s     lab_11
  1666.                beq.s     lab_12
  1667.  
  1668.                btst      #1,6(a2)
  1669.                bne.s     lab_13
  1670. loop_9:        
  1671.                move.w    (a1)+,(a0)
  1672.                adda.w    d3,a0               ; + Bytes per Line
  1673.                dbf       d2,loop_9           ; nächste Zeile
  1674.                rts                           ; raus
  1675. ;-----------------------
  1676. lab_13:        
  1677.                move.l    (a1)+,(a0)
  1678.                adda.w    d3,a0
  1679.                dbra      d2,lab_13
  1680.                rts       
  1681. ;-----------------------------------------------------
  1682. lab_12:        
  1683.                movea.l   a0,a5
  1684.                add.w     d4,d4
  1685.                btst      #1,6(a2)
  1686.                bne.s     lab_14
  1687.                movea.l   a1,a2
  1688.                adda.w    d4,a2
  1689. loop_5:        
  1690.                move.w    (a1)+,(a0)+
  1691.                move.w    (a2)+,(a0)
  1692.                adda.w    d3,a5
  1693.                movea.l   a5,a0
  1694.                dbra      d2,loop_5
  1695.                rts       
  1696. ;-------------
  1697. lab_14:        
  1698.                movea.l   a1,a2
  1699.                adda.w    d4,a2
  1700.                adda.w    d4,a2
  1701. loop_6:        
  1702.                move.w    (a1)+,(a0)+
  1703.                move.w    (a2)+,(a0)+
  1704.                move.w    (a1)+,(a0)+
  1705.                move.w    (a2)+,(a0)
  1706.                adda.w    d3,a5
  1707.                movea.l   a5,a0
  1708.                dbra      d2,loop_6
  1709.                rts       
  1710.  
  1711. ;-----------------------------------------------------
  1712.  
  1713. lab_11:        
  1714.                movea.l   a0,a5
  1715.                add.w     d4,d4
  1716.                btst      #1,6(a2)            ; VDI oder XOR ?
  1717.                bne.s     lab_15              ;
  1718.                movea.l   a1,a2
  1719.                adda.w    d4,a2
  1720.                movea.l   a2,a3
  1721.                adda.w    d4,a3
  1722.                movea.l   a3,a4
  1723.                add.w     d4,d4
  1724. loop_7:        
  1725.                move.w    (a1)+,(a0)+
  1726.                move.w    (a2)+,(a0)+
  1727.                move.w    (a3)+,(a0)+
  1728.                move.w    (a4)+,(a0)
  1729.                adda.w    d3,a5
  1730.                movea.l   a5,a0
  1731.                dbra      d2,loop_7
  1732.                rts       
  1733. ;-------------
  1734. lab_15:        
  1735.                add.w     d4,d4
  1736.                movea.l   a1,a2
  1737.                adda.w    d4,a2
  1738.                movea.l   a2,a3
  1739.                adda.w    d4,a3
  1740.                movea.l   a3,a4
  1741.                adda.w    d4,a4
  1742. loop_8:        
  1743.                move.w    (a1)+,(a0)+
  1744.                move.w    (a2)+,(a0)+
  1745.                move.w    (a3)+,(a0)+
  1746.                move.w    (a4)+,(a0)+
  1747.                move.w    (a1)+,(a0)+
  1748.                move.w    (a2)+,(a0)+
  1749.                move.w    (a3)+,(a0)+
  1750.                move.w    (a4)+,(a0)
  1751.                adda.w    d3,a5
  1752.                movea.l   a5,a0
  1753.                dbra      d2,loop_8
  1754. lab_10:        
  1755.                rts       
  1756. ;-----------------------------------------------------
  1757.  
  1758. CalcScreenPos: 
  1759. ; Parameter :
  1760. ; in :
  1761. ; D0.W = X-Position
  1762. ; D1.W = Y-Position
  1763. ; out :
  1764. ; D0.W = X mod 15
  1765. ; D1.L = offset vom Bildschirmanfang
  1766. ; alle anderen Register unverändert
  1767.  
  1768.                movem.w   d2/d3,-(sp)
  1769.  
  1770.                mulu    B_pl,d1              ; Y *= Bytes per line
  1771.                clr.l     d2
  1772.                move.w    d0,d2               ; (long) X
  1773.                andi.w    #$fff0,d2
  1774.                move.w    MonPLine,d3
  1775.                asr.l     d3,d2
  1776.                add.l     d2,d1
  1777.                andi.w    #$f,d0              ; X mod 15
  1778.  
  1779.                movem.w   (sp)+,d2/d3
  1780.  
  1781.                rts       
  1782. ;#############################################################
  1783.  
  1784.                DATA
  1785.  
  1786. msg_title:     DC.b 13,10
  1787.                DC.b '⌠ OVERSCAN Version ',27,'p',' 1.6b ',27,'q',' K.Isakovic ⌠',13,10,0
  1788. msg_installed: DC.b '| installed.              B.Gebauer  |',13,10
  1789.                DC.b '|                                    |',13,10
  1790.                DC.b '| Edited for 60Hz  By: Bradford Mott |',13,10
  1791.                DC.b '|                                    |',13,10
  1792.                DC.b '⌡ Hold Shift-Key for Setup           ⌡',13,10,0
  1793. msg_notactive: DC.b '⌡ NOT activated.          B.Gebauer  ⌡',13,10,0
  1794. msg_noTos:     DC.b '| NOT installed.          B.Gebauer  |',13,10,7,7
  1795.                DC.b '⌡ Only with TOS 1.2/1.4 or BETA-TOS  ⌡',13,10,0
  1796. msg_already:   DC.b '⌡ already installed...    B.Gebauer  ⌡',13,10,7,7,0
  1797.  
  1798. msg_erase:     DC.b 27,'E',0
  1799. user_x:        DC.b 27,'Y',33,40,27,'p','X:',0
  1800. user_y:        DC.b 'Y:',0
  1801. user_off:      DC.b 'Off:',0
  1802. user_number:   DC.b '    '
  1803. end_number:    DC.b ' ',0
  1804.  
  1805.    
  1806. msg_help:      DC.b 27,'H',27,'p'
  1807.                DC.b '⌠ OVERSCAN Version ',27,'q',' 1.6b ',27,'p',' K.Isakovic ⌠',13,10
  1808.                DC.b '|    Setup-Menu           B.Gebauer  |',13,10
  1809.                DC.b '|                                    |',13,10
  1810.                DC.b '| Edited for 60Hz  By: Bradford Mott |',13,10
  1811.                DC.b '|------------------------------------|',13,10
  1812.                DC.b '| Cursorkeys : Width & Heigth        |',13,10
  1813.                DC.b '| Block  / * : Edge left/right       |',13,10
  1814.                DC.b '| Block  - + : Edge up/down          |',13,10
  1815.                DC.b '|                                    |',13,10
  1816.                DC.b '|      P     : Physbase emulation    |',13,10
  1817.                DC.b '|      C     : Clear screen key      |',13,10
  1818.                DC.b '|                                    |',13,10
  1819.                DC.b '|    L M H   : Low Middle High Res.  |',13,10
  1820.                DC.b '|                                    |',13,10
  1821.                DC.b '|      S     : Save & Quit           |',13,10
  1822.                DC.b '|      Q     : Quit without saving   |',13,10
  1823.                DC.b '|                                    |',13,10
  1824.                DC.b '|     Help   : This page             |',13,10
  1825.                DC.b '|------------------------------------|',13,10
  1826.                DC.b '⌡   Press Return...                  ⌡',0
  1827.  
  1828. msg_change:    DC.b 10,10
  1829.                DC.b 13,10,'       Change Resolution.'
  1830.                DC.b 13,10,'     Are you shure (y/n) ?',0
  1831.  
  1832. msg_phys_on:   DC.b 10,10,13,10,'     Physbase emulation on  (y/n)',0
  1833. msg_phys_off:  DC.b 10,10,13,10,'     Physbase emulation off (y/n)',0
  1834.  
  1835. msg_shift_on:  DC.b 10,10,13,10,' Clear-screen with RIGHT-SHIFT/ALT/HELP (y/n)',0
  1836. msg_shift_off: DC.b 10,10,13,10,' Clear-screen with ALT/HELP  (y/n)',0
  1837.  
  1838. save_name:     DC.b 'A:\AUTO\OSCAN_60.PRG',0
  1839.  
  1840. msg_save:      DC.b 27,'q',13,10,'  Setup saved...',13,10,0
  1841. msg_notfound:  DC.b 27,'q',' not found !',13,10
  1842.                DC.b 'press < Return > ',13,10,0
  1843. msg_nosave:    DC.b 27,'q',13,10,'  Setup not saved...'
  1844.                DC.b 13,10,0
  1845. SoundTab:      DC.b 0,112,1,4,2,56,3,2,4,28,5,1
  1846.                DC.b 6,20
  1847.                DC.b 7,0
  1848.                DC.b 8,16,9,16,10,16
  1849.                DC.b 11,0,12,16,13,4
  1850.                DC.b 255,16
  1851.                DC.b 7,63
  1852.                DC.b 255,4
  1853.                DC.b 11,0,12,32,13,0
  1854.                DC.b 7,56
  1855.                DC.b 255,50
  1856.                DC.b 7,63
  1857.                DC.b 255,0
  1858.  
  1859.                BSS
  1860. GemStarted:    DS.w 1   ; Läuft GEM schon ?
  1861. BadTos:        DS.w 1   ; !0 == BlitterTOS
  1862. Offset:        DS.w 1   ; Offset VideoAdd <> MyMemtop
  1863. RezX:          DS.w 1   ; Breite des Bildschirms
  1864. RezY:          DS.w 1   ; Höhe   des Bildschirms
  1865. B_pl:          DS.w 1   ; BytesPerLine , also Bytes pro Bildschirmzeile
  1866. Reso:          DS.w 1   ; Aktuelle Auflösung
  1867. MonPLine:      DS.w 1   ; ??? (was immer sich Julian dabei dachte...)
  1868. VPlanes:       DS.w 1   ; Anzahl der Farbebenen
  1869. LineA:         DS.l 1   ; Zeiger auf LineA Variablen
  1870. MouseVec:      DS.l 1   ; temp. Kbdvbase
  1871. WorkOut:       DS.l 1   ; Zeiger auf das WorkOut-Feld der 'v_opnwk()'-
  1872. ;           aufrufenden Funktion (hoffentlich der DESKTOP !)
  1873. Back:          DS.l 1   ; RücksprungAddresse zu dieser Funktion
  1874. MyMemtop:      DS.l 1   ;   Zwischenspeicher zur Restauration des Desktops nach
  1875. VidAdd:        DS.l 1   ;   einem inkompatiblen Programm
  1876. BasAdd:        DS.l 1   ;
  1877. MemEnd:        DS.l 1   ;   Letzte beschreibbare Speicheraddresse
  1878. StartBasAdd:   DS.l 1   ;   v_bas_add zu Beginn des Programms
  1879. Dx:            DS.w 1   ; Zwischenspeicher für GrowBox Effekt
  1880. Dy:            DS.w 1   ; Abweichung der Auflösung
  1881. Max:           DS.w 1   ; Grössere Abweichung
  1882. Xa:            DS.w 1   ;
  1883. Ya:            DS.w 1   ; Koordinaten des GrowBox Effekt
  1884. Xe:            DS.w 1   ;
  1885. Ye:            DS.w 1   ;
  1886. X_Add:         DS.l 1   ; Zeiger auf die aktuellen Bildschirmwerte
  1887. Y_Add:         DS.l 1   ;
  1888. Off_Add:       DS.l 1   ;
  1889. Y_Inc:         DS.w 1   ; Inkrement der Bildschirmwerte
  1890. Off_Inc:       DS.l 1   ;
  1891. X_Min:         DS.w 1   ; Grenzen der Bildschirmwerte
  1892. X_Max:         DS.w 1   ;
  1893. Y_Min:         DS.w 1   ;
  1894. Y_Max:         DS.w 1   ;
  1895. Pal3Save:      DS.w 1   ; Farbpalette 3
  1896. PalFSave:      DS.w 1   ; Farbpalette 15
  1897. ResoSave:      DS.w 1   ; Start-Auflösung
  1898. UserKey:       DS.w 1   ; Tastendruck beim UserSetup
  1899. UserSave:      DS.w 1   ; EndeFlag für UserSetup
  1900. Handle:        DS.w 1   ; Dateihandle
  1901. inst_ok:       DS.w 1   ; Installationsstatus
  1902. _ende:         DS.w 1   ;
  1903.  
  1904.  
  1905.   end
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.